const ncname = `[a-zA-Z_][\\-\\.0-9_a-zA-Z]*`; // abc-aaa
const qnameCapture = `((?:${ncname}\\:)?${ncname})`; // <aaa:asdads>
const startTagOpen = new RegExp(`^<${qnameCapture}`);

let r = `<a:b>`.match(startTagOpen);
console.log(r);
/*
[ '<a:b', 'a:b', index: 0, input: '<a:b>', groups: undefined ]

因为 我们在(${ncname}\\:)里使用了?: ,即匹配不捕获
故匹配到的 ${ncname}\\: 并不会显示到这里返回的结果
So 有同学可能会问 既然你都不想捕获 为什么要用`()`了？ 直接去掉`()`不就好了
emmm `()`除了会让里面的表示的内容被捕获外 其实还有另外一个作用 就是让里面的正则表达式成为一个整体 这样就可以和后面的量词搭配使用 比如这里的(?:${ncname}\\:)? 的()?
*/
